package com.guodi.common.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.HashMap;
import java.util.Map;

/**
 * 单位转换工具
 * @作者： 陈宏成
 * @日期： 2021/12/3
 */
public class UnitConvertUnit {
    /**
     * 面积单位转换map
     * key 面积类型名称
     * value 与基数相差的倍数，该类型单位 = 基数单位 * 相差倍数
     * */
    private static Map<String, BigDecimal> areaUnitConverMap;
    /**
     * 面积的基数单位
     * */
    private static String areaBasicUnit;

    /**
     * 长度单位转换map
     * key 长度类型名称
     * value 与基数相差的倍数，该类型单位 = 基数单位 * 相差倍数
     * */
    private static Map<String, BigDecimal> lengthUnitConverMap;
    /**
     * 长度的基数单位
     * */
    private static String lengthBasicUnit;

    static {
        // 面积单位
        areaUnitConverMap = new HashMap<>();
        areaBasicUnit = "平方米";
        areaUnitConverMap.put("平方米", new BigDecimal(1.0));
        areaUnitConverMap.put("平方毫米", new BigDecimal(1000000.0));
        areaUnitConverMap.put("平方厘米", new BigDecimal(10000.0));
        areaUnitConverMap.put("公顷", new BigDecimal(0.0001));
        areaUnitConverMap.put("平方公里", new BigDecimal(0.000001));
        areaUnitConverMap.put("平方千米", new BigDecimal(0.000001));
        areaUnitConverMap.put("平方英寸", new BigDecimal(1550.003));
        areaUnitConverMap.put("平方英尺", new BigDecimal(10.76391));
        areaUnitConverMap.put("平方码", new BigDecimal(1.19599));
        areaUnitConverMap.put("英亩", new BigDecimal(0.000247));
        areaUnitConverMap.put("平方英里", new BigDecimal(0.000000386102159));

        // 长度单位
        lengthUnitConverMap = new HashMap<>();
        lengthBasicUnit = "米";
        lengthUnitConverMap.put("厘米", new BigDecimal(100));
        lengthUnitConverMap.put("cm", new BigDecimal(100));
        lengthUnitConverMap.put("纳米", new BigDecimal(1000000000));
        lengthUnitConverMap.put("nm", new BigDecimal(1000000000));
        lengthUnitConverMap.put("微米", new BigDecimal(1000000));
        lengthUnitConverMap.put("um", new BigDecimal(1000000));
        lengthUnitConverMap.put("毫米", new BigDecimal(1000));
        lengthUnitConverMap.put("mm", new BigDecimal(1000));
        lengthUnitConverMap.put("米", new BigDecimal(1));
        lengthUnitConverMap.put("m", new BigDecimal(1));
        lengthUnitConverMap.put("分米", new BigDecimal(10));
        lengthUnitConverMap.put("dm", new BigDecimal(10));
        lengthUnitConverMap.put("千米", new BigDecimal(0.001));
        lengthUnitConverMap.put("km", new BigDecimal(0.001));
        lengthUnitConverMap.put("公里", new BigDecimal(0.001));
        lengthUnitConverMap.put("英寸", new BigDecimal(39.37007874));
        lengthUnitConverMap.put("英里", new BigDecimal(0.00062137));
        lengthUnitConverMap.put("英尺", new BigDecimal(3.2808399));
        lengthUnitConverMap.put("码", new BigDecimal(1.093613));
        lengthUnitConverMap.put("海里", new BigDecimal(0.00053996));
    }

    /**
     * 面积转换单位
     * @入参： value 原值
     * @入参： originalUnit 原单位
     * @入参： newUnit 原单位
     * @出参： 转成基本单位后的面积
     * @作者： 陈宏成
     * @日期： 2021/12/3
     */
    public static String areaConver(String value, String originalUnit, String newUnit){
        unitExist(areaUnitConverMap, originalUnit);
        unitExist(areaUnitConverMap, newUnit);
        BigDecimal bigDecimal = new BigDecimal(value);
        // 面积转成基本单位
        BigDecimal divisor = areaUnitConverMap.get(originalUnit);
        bigDecimal = bigDecimal.divide(divisor, 10, RoundingMode.HALF_UP);
        // 转成目标单位
        BigDecimal multiplier = areaUnitConverMap.get(newUnit);
        bigDecimal = bigDecimal.multiply(multiplier);
        // 返回
        return bigDecimal.toString();
    }

    /**
     * 长度转换单位
     * @入参： value 原值
     * @入参： originalUnit 原单位
     * @入参： newUnit 原单位
     * @出参： 转成基本单位后的面积
     * @作者： 陈宏成
     * @日期： 2021/12/06
     */
    public static String lengthConver(String value, String originalUnit, String newUnit){
        unitExist(lengthUnitConverMap, originalUnit);
        unitExist(lengthUnitConverMap, newUnit);
        BigDecimal bigDecimal = new BigDecimal(value);
        // 长度转成基本单位
        BigDecimal divisor = lengthUnitConverMap.get(originalUnit);
        bigDecimal = bigDecimal.divide(divisor, 10, RoundingMode.HALF_UP);
        // 转成目标单位
        BigDecimal multiplier = lengthUnitConverMap.get(newUnit);
        bigDecimal = bigDecimal.multiply(multiplier);
        // 返回
        return bigDecimal.toString();
    }

    private static void unitExist(Map<String, BigDecimal> unitMap, String unit){
        if (!unitMap.containsKey(unit)){
            throw new RuntimeException("单位: " + unit + " 不在转换范围内");
        }
    }
}
